/** ***********************************************************************************
* @file         event_task.h
* @brief        事件处理基础管理任务
* @details      主要用来处理和采集设备中的各种事件，硬件状态、数据采集等操作
* @author       杨小珛
* @date         2020/12/23
* @copyright    北京高知科技有限公司    
* @version      V1.0
* @attention    无
**************************************************************************************/

#ifndef EVENT_TASK_H
#define EVENT_TASK_H

#include "os_app.h"

#define     EVENT_RESET_REASON_MIN_VALUE            (0x01)
#define     EVENT_RESET_REASON_NET_NOT_REG          (0x01)  /*网络未注册*/
#define     EVENT_RESET_REASON_REG_NOT_CON          (0x02)  /*网络注册 未建立有效链接 */
#define     EVENT_RESET_REASON_CON_NOT_DATA         (0x03)  /*有链接，长时间未收发数据 */
#define     EVENT_RESET_REASON_SOFTWAR_DOG          (0x04)  /*软件狗，复位 */
#define     EVENT_RESET_REASON_MEMROY_LEAK          (0x05)  /*内存泄漏 */
#define     EVENT_RESET_REASON_SERVER_REQUIRE       (0x06)  /*平台重启 9574 */
#define     EVENT_RESET_REASON_NO_SLEEP             (0x07)  /*休眠异常 */
#define     EVENT_RESET_REASON_GSENSOR_ERR          (0x08)  /*GSENSOR异常 */
#define     EVENT_RESET_REASON_RUN_7_DAY            (0x09)  /*连续运行超过7天 */
#define     EVENT_RESET_REASON_RTC_ERR              (0x0A)  /*RTC异常 */
#define     EVENT_RESET_REASON_MAX_VALUE            (0x0A)


#define EVENT_SAM_REV_RUN_WAIT_TIME         ( 1000 )
#define EVENT_SAM_REV_SLEEP_WAIT_TIME       ( 5000 )

#define EVENT_NET_ANOMALY_MAX_TIME          ( 3600 )     /*网络运行异常时间60分钟，60 * 60 */
#define EVENT_VEH_SHIFITING_MAX_TIME        ( 600 )     /*车辆运行异常时间10分钟，10 * 60 */
#define EVENT_SIM_ANOMALY_MAX_TIME          ( 5 )       /*SIM卡切换等待时间 5秒钟*/
#define EVENT_VEH_GNSS_RESET_MAX_TIME       ( 180 )     /*GNSS重新定位 3分钟，3 * 60 */

#if( OS_HALUO_PROJECT_ENABLE == 1 )
#define EVENT_NET_DATA_VOLUME_MAX_TIME      ( 120 )     /*网络传输数据包异常时间2分钟，2 * 60*/
#else
#define EVENT_NET_DATA_VOLUME_MAX_TIME      ( 1800 )    /*网络传输数据包异常时间30分钟，30 * 60*/
#endif

#define EVENT_NET_NOT_CON_VOLUME_MAX_TIME      ( 10800 )    /*未建立任何网络连接 30 * 60*/

#define EVENT_BLE_CONNECT_MAX_TIME          ( 600 )     /*BLE连接最长时间10分钟，10 * 60*/
#define EVENT_SYS_RUN_STATUS_TIME           ( 1800 )     /*系统运行状态检测30分钟，30 * 60*/

#define EVENT_NET_ANOMALY_GNSS_SPEED        ( 10 )     /*网络运行异常时，GNSS当前的速度 */
#define EVENT_NET_ANOMALY_VEH_SPEED         ( 10 )     /*网络运行异常时，车辆当前的速度 */

/**********************EVENT事件结构体声明************************************/
#define EVENT_TRIG_MSG_QUEUE_DEPTH  ( 5 )

#define EVENT_TRIG_PWR  ( 0x01 )    /* 1 系统快速触发电影管理事件*/    
#define EVENT_TRIG_RTC  ( 0x02 )    /* 2 RTC 周期采集事件,默认周期1S钟*/
#define EVENT_TRIG_INT  ( 0x03 )    /* 3 外部中断事件唤醒系统*/
#define EVENT_TRIG_OTA  ( 0x04 )    /* 4 OTA 远程升级事件触发*/
#define EVENT_TRIG_CAN  ( 0x05 )    /* 5 CAN 总线控制结果*/




typedef struct
{
    uint32_t command_id;        /*命令ID    */
    uint32_t returns_res;       /*应答结果*/
}event_trig_msg_s;

/************定义事件检测外部数据************************************************/

typedef enum
{
    EVENT_POWER = 0,
    EVENT_SPEED,
    EVENT_ENGINE,
    EVENT_VEHICLE,
    EVENT_SIMCARD,
    EVENT_DIRECTION,
    EVENT_SYSTEMSTATUS,
}event_input_e;

typedef struct
{
    uint32_t power;       /* 外部电源电压值*/
    uint32_t speed;       /* 车辆当前的速度，单位KM/H；*/
    uint32_t engine;      /* 车辆当前的发动机状态*/
    uint32_t vehicle;     /* 车辆当前的的状态，1-主要用于GSEN唤醒后检测拖车使用，2-主要用于网上设置重新开启GNSS定位*/
    uint32_t simcard;     /* sim卡贴换状态，1-通知应用层进行SIM卡贴换，2-SIM卡通知切换成功*/   
    uint32_t direction;   /* 当前车辆运行的方向，0-车辆停止，1-车辆前进，2-车辆后退*/
    uint32_t systemstatus;  /*系统运行的状态，*/
}event_input_data_t;

typedef struct
{
    union                                   
    {
        volatile uint32_t        status;          // PORT端口
        struct
        {
            volatile uint32_t    engine   :  1;     //发动机状态，bit0：1-运行 0-未运行
            volatile uint32_t    vehicle  :  2;     //车辆状态，bit1~bit2：0 - 未设置 1 - 位移设置 2- GPS控制设置
            volatile uint32_t    work     :  3;     //系统工作模式，bit3~bit5：0 - 初始化 1- 系统启动 2 - 正常运行 3 - 睡眠状态 4 - 省电状态 5 - 唤醒状态
            volatile uint32_t    kl15     :  3;     //KL15工作状态，bit6~bit8：0- 初始化 1 - KL15低 2- KL15高
            volatile uint32_t    veh      :  3;     //车辆状态状态，bit9~bit11: 0- 初始化 1 - 开始 2 - 停止
            volatile uint32_t    can      :  3;     //CAN总线唤醒状态， bit12~bit14: 0 - 初始化 1 - 唤醒 2 - 运行 3 - 睡眠 4 - 睡眠中
            volatile uint32_t    rtc      :  3;     //RTC唤醒状态， bit15~bit17: 0 - 初始化 1 - 唤醒 2 - 运行 3 - 睡眠 4 - 睡眠中  
            volatile uint32_t    net      :  3;     //网络唤醒状态， bit18~bit20: 0 - 初始化 1 - 唤醒 2 - 运行 3 - 睡眠 4 - 睡眠中
            volatile uint32_t    ble      :  3;     //BLE唤醒状态， bit21~bit23: 0 - 初始化 1 - 唤醒 2 - 运行 3 - 睡眠 4 - 睡眠中
            volatile uint32_t    gsen     :  3;     //三轴唤醒状态， bit24~bit26: 0 - 初始化 1 - 唤醒 2 - 运行 3 - 睡眠 4 - 睡眠中
            volatile uint32_t    time     :  3;     //定时器唤醒状态， bit27~bit29: 0 - 初始化 1 - 唤醒 2 - 运行 3 - 睡眠 4 - 睡眠中
            volatile uint32_t    res      :  2;     //保留 bit30~bit31
        };
    };
} event_system_status_s;

/** ****************************************************************************
* @remarks       void event_create_task(unsigned portBASE_TYPE uxPriority)
* @brief         创建事件基础管理任务
* @param[in]     uxPriority 任务优先级；
* @param[out]    无
* @return        无
* @attention     系统启动后创建
*******************************************************************************/
extern void event_create_task(unsigned portBASE_TYPE uxPriority);

/** ****************************************************************************
* @remarks       uint8_t event_queue_put(event_trig_msg_s *event_msg)
* @brief         发送事件采集任务消息队列数据
* @param[in]     无
* @param[out]    *event_msg 事件消息结构体数据
* @return        1 有数据 0 没有数据
* @attention     无
*******************************************************************************/
extern uint8_t event_queue_put(event_trig_msg_s *event_msg);

/** ****************************************************************************
* @remarks       uint8_t event_queue_put_isr(event_trig_msg_s *event_msg)
* @brief         在中断中发送事件采集任务消息队列数据
* @param[in]     *event_msg 事件消息结构体数据
* @param[out]    无
* @return        1 发送数据成功 0 发送数据失败
* @attention     在中断函数中使用
*******************************************************************************/
extern uint8_t event_queue_put_isr(event_trig_msg_s *event_msg);

/** ****************************************************************************
* @remarks       uint32_t event_input_data_set( event_input_data_t event )
* @brief         设置事件数据
* @param[in]     event  设置数据类型
* @param[in]     data 设置的数据
* @param[out]    无
* @return        无
* @attention     无
*******************************************************************************/
extern void event_input_data_set( event_input_e event , uint32_t data );

/** ****************************************************************************
* @remarks       uint32_t event_input_data_set( event_input_data_t event )
* @brief         设置事件数据
* @param[in]     event  设置数据类型
* @param[out]    无
* @return        返回查询的数据
* @attention     无
*******************************************************************************/
extern uint32_t event_input_data_get( event_input_e event );

/** ****************************************************************************
* @remarks       void event_input_data_set( event_input_e event , uint32_t data )
* @brief         设置车辆存储数据
* @param[in]     len 数据长度
* @param[in]     data 设置的数据
* @param[out]    无
* @return        无
* @attention     无
*******************************************************************************/
extern void event_input_save_data_set( void *data , uint16_t len );

/** ****************************************************************************
* @remarks       void car_save_data_to_flash(void)
* @brief         存储车辆存储数据
* @param[in]     len 数据长度
* @param[in]     data 数据
* @param[out]    无
* @return        无
* @attention     无
*******************************************************************************/
extern void car_save_data_to_flash(void);

/******************************************************************************
* @remarks       uint32_t reset_reason_set(uint8_t reason)
* @brief         设置设备的重启原因
* @param[in]     无
* @param[out]    无
* @return        无
* @attention     无
*******************************************************************************/
extern uint32_t reset_reason_set(uint8_t reason);

/******************************************************************************
* @remarks       uint32_t reset_reason_get(uint8_t *reason)
* @brief         获取设备的重启原因
* @param[in]     无
* @param[out]    无
* @return        无
* @attention     无
*******************************************************************************/
extern uint32_t reset_reason_get(uint8_t *reason);

/******************************************************************************
* @remarks      uint32_t reset_reason_clear(void)
* @brief         鉴权成功，清除重启的结果
* @param[in]     无
* @param[out]    无
* @return        无
* @attention     无
*******************************************************************************/
extern uint32_t reset_reason_clear(void);

#endif


